package com.captcha.demo.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.captcha.demo.model.CaptchaYml;
import com.captcha.demo.model.Constants;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Date;

@RequestMapping("/captcha")
@RestController
public class CaptchaController {
    // 有效期为1分钟 (1s = 1000 ms)
    private final static long SESSION_VALID_TIME = 60 * 1000;

    @Autowired
    private CaptchaYml captchaYml;

    @RequestMapping("/getCaptcha")
    public void getCaptcha(HttpSession session, HttpServletResponse response) throws IOException {
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaYml.getWideth(), captchaYml.getHeight());

        // 设置返回类型，这里我们返回的是图片
        response.setContentType("image/jpeg");
        // 禁止缓存
        response.setHeader("Pragma", "No-cache");

        lineCaptcha.write(response.getOutputStream());
        // 存储 session
        session.setAttribute(captchaYml.getSession().getCode(), lineCaptcha.getCode());

        // 存储 session 时的当前时间
        // 也可以使用 System.currentTimeMillis() 方法有很多，不用拘于一个
        session.setAttribute(captchaYml.getSession().getTime(),new Date());

        // Servlet的OutputStream 记得自行关闭
        response.getOutputStream().close();
    }

    @RequestMapping("/check")
    public Boolean checkCaptcha(String inputCaptcha, HttpSession session) {
        // 与用户输入的验证码相比较
        // 用户输入的可能为空，要判定
        if (!StringUtils.hasLength(inputCaptcha)) {
            // 长度为 0，返回 false
            return false;
        }
        // 从 session 中获取验证码
        String inputCode = (String)session.getAttribute(captchaYml.getSession().getCode());

        Date captchaValidTime = (Date)session.getAttribute(captchaYml.getSession().getTime());
        // 拿到之后与用户输入的验证码相比较
        if (inputCaptcha.equalsIgnoreCase(inputCode)) {
            // 验证码相同，还要验证 验证码是否过期(应该是必须拿到这个时间，该时间不能为null)
            if (captchaValidTime != null && System.currentTimeMillis() - captchaValidTime.getTime() < SESSION_VALID_TIME) {
                return true;
            }
        }

        return false;
    }
}
